#include "MapaParser.h"
#include "Conquista.h"
#include "Eliminacion.h"
#include <iostream>
#include <cstdlib>

MapaParser::MapaParser(Mapa* unMapa) : xmlpp::SaxParser()
{
	mapaDelJuego = unMapa;
	this->parseoFinalizado = false;
}

void MapaParser::on_start_element(const Glib::ustring& name,
                                const AttributeList& properties){
	  if(name.compare("continente") == 0){
	  		cargaContinente(properties);
	  }
	  else if(name.compare("pais") == 0){
	  		cargaPais(properties);
	  	}
	  else if(name.compare("conexion") == 0){
	  		cargaConeccion(properties);
	  }
	  else if(name.compare("ruta") == 0){
		  setearPathImagen(properties);
	  }
	  else if(name.compare("conquista") == 0){
	 	  cargarCartaConquista(properties);
	  }
	  else if(name.compare("eliminacion") == 0){
		  cargarCartaEliminacion(properties);
	  }
}

void MapaParser::cargarCartaConquista(const AttributeList& properties){
	string continente = "";
	string extras = "";
	for(xmlpp::SaxParser::AttributeList::const_iterator iter = properties.begin(); iter != properties.end(); ++iter){
		if(iter->name.compare("continente") == 0)
			continente = iter->value;
		else if(iter->name.compare("extras") == 0)
			extras = iter->value;
	}
	this->mapaDelJuego->agregarCartaDeObjetivos(new Conquista(continente,atoi(extras.data())));
}

void MapaParser::cargarCartaEliminacion(const AttributeList& properties){
	string color = "";
	for(xmlpp::SaxParser::AttributeList::const_iterator iter = properties.begin(); iter != properties.end(); ++iter){
		if(iter->name.compare("color") == 0)
			color = iter->value;
	}
	this->mapaDelJuego->agregarCartaDeObjetivos(new Eliminacion(color));
}

void MapaParser::setearPathImagen(const AttributeList& properties){
	for(xmlpp::SaxParser::AttributeList::const_iterator iter = properties.begin(); iter != properties.end(); ++iter){
		if(iter->name.compare("path") == 0)
			this->path = iter->value;
	}
}

void MapaParser::cargaContinente(const AttributeList& properties){
	int bonusPorContinente = 0;
	for(xmlpp::SaxParser::AttributeList::const_iterator iter = properties.begin(); iter != properties.end(); ++iter){
		if(iter->name.compare("nombre") == 0)
			this->continente = iter->value;
		else if(iter->name.compare("bonus") == 0)
			bonusPorContinente = atoi(iter->value.data());
	}
	if (mapaDelJuego->obtenerContinente(this->continente) == NULL)
		mapaDelJuego->agregarContinente(this->continente,bonusPorContinente);
	else
		mapaDelJuego->obtenerContinente(this->continente)->setBonus(bonusPorContinente);
}

void MapaParser::cargaPais(const AttributeList& properties){
	int x = 0;
	int y = 0;
	for(xmlpp::SaxParser::AttributeList::const_iterator iter = properties.begin(); iter != properties.end(); ++iter) {
		if(iter->name.compare("nombre") == 0)
			this->pais = iter->value;
		else if(iter->name.compare("x") == 0)
			x = atoi(iter->value.c_str());
		else if(iter->name.compare("y") == 0)
				y = atoi(iter->value.c_str());
	}
	if (mapaDelJuego->obtenerTerritorio(this->pais) == NULL)
			mapaDelJuego->agregarTerritorio(this->pais,x,y,this->continente);
	else {
		Territorio* aux = mapaDelJuego->obtenerTerritorio(this->pais);
		aux->setX(x);
		aux->setY(y);
	}
}

void MapaParser::cargaConeccion(const AttributeList& properties){
	
	string nPais, nContinente;
	
	for(xmlpp::SaxParser::AttributeList::const_iterator iter = properties.begin(); iter != properties.end(); ++iter){
		if(iter->name.compare("nombre") == 0)
			nPais = iter->value;
		else if(iter->name.compare("continente") == 0)
			nContinente.assign(iter->value);
	}
	
	Territorio* aux = mapaDelJuego->obtenerTerritorio(pais);
	
	if (mapaDelJuego->obtenerTerritorio(nPais) == NULL) {
		if (mapaDelJuego->obtenerContinente(nContinente) == NULL)
			mapaDelJuego->agregarContinente(nContinente);
		mapaDelJuego->agregarTerritorio(nPais,0,0,nContinente);
	}
	aux->agregarAdyacencia(mapaDelJuego->obtenerTerritorio(nPais));
}

Mapa* MapaParser::obtenerMapa() {
	return mapaDelJuego;
}


void MapaParser::on_end_element(const Glib::ustring& name) {
	 if (name.compare("mapa") == 0) 
		 parseoFinalizado = true;
}

bool MapaParser::isParseoFinalizado() {
	return parseoFinalizado;
}

bool MapaParser::isParseoCorrecto() {
	return parseoCorrecto;
}

string MapaParser::getPathImagen() {
	return path;
}

void MapaParser::on_error(const Glib::ustring& text)
{
	this->parseoCorrecto = false;
}

MapaParser::~MapaParser()
{
}

